package classDemo;

/**
 * Created by AJie on 2019/7/26
 * Function :
 *  todo 总结
 *  1、这里最大的原因就是，连接加载的时候，要给属性初始化，
 *  2、而这里的初始化又刚好是 创建java 实例，需要执行构造，
 *  3、执行构造的前面又必须先执行 {} 大括号非 static 块
 *  4、执行完属性，再初始化 static block
 *
 *  结果：
 * Singleton2  block ！！！
 * Singleton2 new instance
 * Singleton2 static block
 * forTest
 *
 * 整个的流程详解：
 *
 * 执行的第一步：Singleton.forTest();
 *
 * 这时候，对Singleton类进行加载和连接，所以首先需要对它进行加载和连接操作。
 *
 * 在连接-准备阶段，要讲给静态变量赋予默认初始值，这里还没到执行 forTest
 *
 * todo 1 初始值是   singleton = null
 *
 * 加载和连接完毕之后，再进行初始化工作
 *
 * private static Singleton singleton = new Singleton();
 *
 * todo 2 所以执行去到了 new Singleton();  这里因为 new 会引起 Singleton 的初始化
 *
 * 需要执行 Singleton构造函数里面的内容
 *
 * todo 3 但是又因为非static初始化块，这里面的代码在创建java对象实例时执行，而且在构造器之前！！！！
 * 所以输出应该是
 *
 * Singleton  block ！！！
 * Singleton new instance
 *
 * todo 4 而根据类的初始化顺序，要执行 static 代码块，应该输出
 * Singleton static block
 *
 *
 */
public class ClassLoad2 {
    public static void main(String args[]){
        Singleton2.forTest();
    }
}
class Singleton2 {
    private static Singleton2 singleton = new Singleton2();

    private Singleton2() {
        System.out.println("Singleton2 new instance");
    }

    public static void forTest() {
        System.out.println("forTest");
    }

    static {
        System.out.println("Singleton2 static block");
    }

    {
        System.out.println("Singleton2  block ！！！ ");
    }

}